#pragma once
#include <iostream>
#include <string>
#include <vector>
#include <cstring>
#include <unistd.h>
#include <netinet/in.h>
#include <netdb.h>
#include <arpa/inet.h>
#include <sys/socket.h>
#include <sys/select.h>
#include <ifaddrs.h>
#include <memory>

#include "core/camera_common.hpp"
#include "websocket/ws_client.hpp"

namespace WD
{
    class ControlSdk
    {
    public:
        ControlSdk();
        ~ControlSdk();
        // 查询网络内的相机列表
        std::vector<CameraInfo> queryCamera();
        // 连接相机
        bool connectCamera(CameraInfo *camera);
        bool connectCamera(std::string& ip);
        // 断开相机
        // isExit:true 断开连接，准备退出程序，不在连接相机 false：断开连接 会再次连接相机
        bool closeCamera(bool isExit);
        // 得到相机连接状态
        bool getCameraState();

        // 开始推流
        void startStream();

        // 停止推流
        void stopStream();
        // 设置照片输出参数
        bool setImageOutParams(const ImageOutParams &config);
        // 设置PPS参数
        bool setPpsParams(const PpsConfigParams &config);
        // PPS开关
        bool setPpsEnable(const bool enable);
        // 设置GPS参数
        bool setGpsParams(const GpsParams &config);
        // GPS开关
        bool setGpsEnable(const bool enable);

        // 设置相机IP参数
        bool setCameraIpParams(const IpConfigParams& config);

    private:
        // 获取本机所有 IPv4 地址
        std::vector<std::string> getLocalIpList();
        // 查询一个网段的相机信息
        std::vector<CameraInfo> queryIpCamera(const std::string &broadcastIp);
        // 通用发送
        bool sendRpc(const std::string &method, const std::string &id, const json &params);

        void sendSimpleRpc(const std::string &method);
        std::function<void(const std::string&)> photo_callback_;

    private:
        boost::asio::io_context ioc_;
        std::unique_ptr<WD::WebSocketClient> web_socket_client_;
        std::mutex web_socket_mutex_;
    };
}
